package com.lituoxy.dialer.util;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GsonUtil {
	public static <T> T getObject(JsonElement json, Class<T> clazz) {
		return getObject(json.toString(), clazz);
	}

	public static <T> T getObject(String json, Class<T> clazz) {
		return new Gson().fromJson(json, clazz);
	}

	public static <T> List<T> getObjectList(JsonElement json, Class<T> clazz) {
		return getObjectList(json.toString(), clazz);
	}

	public static <T> List<T> getObjectList(String json, Class<T> clazz) {
		Gson gson = new Gson();
		List list = new ArrayList();
		List<JsonElement> jsonList = gson.fromJson(json, new TypeToken<List<JsonElement>>() {
		}.getType());
		for (JsonElement jsonElement : jsonList) {
			list.add(gson.fromJson(jsonElement, clazz));
		}
		return list;
	}

	public static String getJsonStr(Object obj) {
		if (obj == null) {
			return null;
		} else {
			return new Gson().toJson(obj);
		}

	}

	private static JsonParser jsonParser = new JsonParser();

	/**
	 * json 选择器 <br/>
	 * 如 user>name 查询失败返回null<br/>
	 * 目前只支持key 不支持数组下标
	 * 
	 * @param data
	 *            待查询的json格式字符串
	 * @param queryText
	 *            选择器描述
	 * */
	public static String query(String data, String queryText) {
		if (data == null) {
			return null;
		}
		JsonElement dataJson = jsonParser.parse(data);
		String[] keys = queryText.split(">");
		for (String key : keys) {
			if (dataJson == null) {
				break;
			}
			// 对象
			else if (dataJson.isJsonObject()) {
				JsonObject dataJsonAsObj = dataJson.getAsJsonObject();
				dataJson = dataJsonAsObj.get(key);
			}
			// 非对象
			else {
				dataJson = null;
				break;
			}
		}
		return dataJson == null ? null : String.valueOf(dataJson);
	}
	
	 /**
     * 得到格式化json数据  退格用\t 换行用\r
     */
    public static String format(String jsonStr) {
    	jsonStr = unescapeUnicode(jsonStr);
        int level = 0;
        StringBuffer jsonForMatStr = new StringBuffer();
        for(int i=0;i<jsonStr.length();i++){
            char c = jsonStr.charAt(i);
            if(level>0&&'\n'==jsonForMatStr.charAt(jsonForMatStr.length()-1)){
                jsonForMatStr.append(getLevelStr(level));
            }
            switch (c) {
            case '{':
            case '[':
                jsonForMatStr.append(c+"\n");
                level++;
                break;
            case ',':
                jsonForMatStr.append(c+"\n");
                break;
            case '}':
            case ']':
                jsonForMatStr.append("\n");
                level--;
                jsonForMatStr.append(getLevelStr(level));
                jsonForMatStr.append(c);
                break;
            default:
                jsonForMatStr.append(c);
                break;
            }
        }
         
        return jsonForMatStr.toString();
 
    }
     
    private static String getLevelStr(int level){
        StringBuffer levelStr = new StringBuffer();
        for(int levelI = 0;levelI<level ; levelI++){
//            levelStr.append("\t");
            levelStr.append("    ");
        }
        return levelStr.toString();
    }

    /** 解码JSON中的中文UNICODE编码(\UXXXX)  */
    public static String unescapeUnicode(String str){
        StringBuffer b=new StringBuffer(str);
        Matcher m = Pattern.compile("\\\\u([0-9a-fA-F]{4})").matcher(str);
        while(m.find()){
        	b.replace(m.start(), m.end(), "UXXXX");
        	b.insert(m.start(),(char) Integer.parseInt(m.group(1),16));
        };
        return b.toString().replaceAll("UXXXX", "");
    }

}
